﻿Imports Oracle.DataAccess.Client
Public Class cMovimiento
    Private lDsmov As dsMovimiento
    Private lDrMov As dsMovimiento.MOV_MOVIMIENTORow
    Private lDtDetMov As dsMovimiento.MOV_MOVIMIENTODETALLEDataTable
    Private liDocumento As cTipoDocumento
    Private liTercero As cTercero
    Private lIVendedor As cVendedor
    Private lICanal As cCanales
    Private lIBodegaOri As cBodegas
    Private lIBodegaDes As cBodegas
    Private lIlistaPrecios As cEncaListaPrecios
    Private lIdProducto As String
    Private lNumeroLinea As Integer
    Sub New(ByVal dsmov As dsMovimiento)
        lDsmov = dsmov
    End Sub

    Sub New(ByVal dsmov As dsMovimiento, ByVal idProducto As String, Optional ByVal numeroLinea As Integer = 0)
        lDsmov = dsmov
        lIdProducto = idProducto
        lNumeroLinea = numeroLinea
    End Sub
    Sub New(ByVal dtMov As dsMovimiento.MOV_MOVIMIENTODataTable, ByVal dtDetMov As dsMovimiento.MOV_MOVIMIENTODETALLEDataTable)
        Try
            lDtDetMov = dtDetMov
            lDrMov = dtMov.Rows(0)
            If Not lDrMov.IsIDDOCREFERENCIANull Then
                liDocumento = New cTipoDocumento(lDrMov.IDDOCUMENTO)
                liTercero = New cTercero(lDrMov.IDTERCERO, "")
                lIVendedor = New cVendedor(lDrMov.IDVENDEDOR)
                lICanal = New cCanales(lDrMov.IDCANAL)
                If Not lDrMov.IsIDBODEGADESTINONull Then _
                    lIBodegaDes = New cBodegas(lDrMov.IDBODEGADESTINO)
                If Not lDrMov.IsIDBODEGAORIGENNull Then _
                    lIBodegaOri = New cBodegas(lDrMov.IDBODEGAORIGEN)


            Else
                Throw New Exception("No existe documento con este tipo y numero, verifique e intente de nuevo")
            End If
        Catch ex As Exception
            cError.SalvaError(ex, "Samuel")
            Throw ex
        End Try
    End Sub
    Public ReadOnly Property idDocumento() As String
        Get
            Return lDrMov.IDDOCUMENTO
        End Get
    End Property

    Public ReadOnly Property numero() As Integer
        Get
            Return lDrMov.NUMERO
        End Get
    End Property

    Public ReadOnly Property fechaDocumento() As Date
        Get
            Return lDrMov.FECHADOCUMENTO
        End Get
    End Property

    Public ReadOnly Property fechaVencimiento() As Date
        Get
            Return lDrMov.FECHADOCUMENTO
        End Get
    End Property

    Public ReadOnly Property Idsede() As String
        Get
            Return lDrMov.IDSEDE
        End Get
    End Property

    Public ReadOnly Property idVendedor() As String
        Get
            Return cGeneral.NToCad(lDrMov.IDVENDEDOR)
        End Get
    End Property

    Public ReadOnly Property idTercero() As String
        Get
            Return lDrMov.IDTERCERO
        End Get
    End Property

    Public ReadOnly Property idCcosto() As String
        Get
            Return lDrMov.IDCCOSTO
        End Get
    End Property

    Public ReadOnly Property idBodegaDestino() As String
        Get
            Return lDrMov.IDBODEGADESTINO
        End Get
    End Property

    Public ReadOnly Property idBodegaOrigen() As String
        Get
            Return lDrMov.IDBODEGAORIGEN
        End Get
    End Property

    Public ReadOnly Property idCanal() As String
        Get
            Return cGeneral.NToCad(lDrMov.IDCANAL)
        End Get
    End Property

    Public ReadOnly Property idLista() As String
        Get
            Return lDrMov.IDLISTA
        End Get
    End Property

    Public ReadOnly Property nota() As String
        Get
            Return lDrMov.NOTA
        End Get
    End Property

    Public ReadOnly Property valorPagos() As Double
        Get
            Return lDrMov.VALORPAGOS
        End Get
    End Property

    Public ReadOnly Property iDocumento() As cTipoDocumento
        Get
            Return liDocumento
        End Get
    End Property

    Public ReadOnly Property iTercero() As cTercero
        Get
            Return liTercero
        End Get
    End Property

    Public ReadOnly Property iVendedor() As cVendedor
        Get
            Return lIVendedor
        End Get
    End Property
    Public Property iLista() As cEncaListaPrecios
        Get

        End Get
        Set(ByVal value As cEncaListaPrecios)

        End Set
    End Property

    Public ReadOnly Property iBodegaDes() As cBodegas
        Get
            Return lIBodegaDes
        End Get
    End Property

    Public ReadOnly Property iBodegaOri() As cBodegas
        Get
            Return lIBodegaOri
        End Get
    End Property

    Public ReadOnly Property iCanal() As cCanales
        Get
            Return lICanal
        End Get
    End Property

    Public ReadOnly Property ValorBase() As Double
        Get
            Return lDrMov.VALORBASE
        End Get
    End Property

    Public ReadOnly Property ValorIva() As Double
        Get
            Return lDrMov.VALORIVA
        End Get
    End Property

    Public ReadOnly Property ValorRetencion() As Double
        Get
            Return lDrMov.VALORRETENCION
        End Get
    End Property

    Public ReadOnly Property saldo() As Double
        Get
            Return lDrMov.SALDO
        End Get
    End Property

    ''' <summary>
    ''' inicializar en el constructor
    ''' </summary>
    Public ReadOnly Property anulado() As Char
        Get
            Return lDrMov.ANULADO
        End Get
    End Property

    ''' <summary>
    ''' inicializar en el constructor
    ''' </summary>
    Public ReadOnly Property impreso() As Char
        Get
            Return lDrMov.IMPRESO
        End Get
    End Property

    ''' <summary>
    ''' Indica documento que lo origino y documento origen
    ''' </summary>
    Public ReadOnly Property idDocReferencia() As String
        Get
            Return lDrMov.IDDOCREFERENCIA
        End Get
    End Property

    ''' <summary>
    ''' Indica documento que lo origino y documento origen
    ''' </summary>
    Public ReadOnly Property numeroReferencia() As Integer
        Get
            Return lDrMov.NUMEROREFERENCIA
        End Get
    End Property

    Public Function buscaOrdenCompra(ByVal tipodoc As String, ByVal numero As Integer) As lbGlobalcom.dsCompras.COM_ENCABEZADOORDENCOMPRADataTable
        Dim daTipodoc As New lbGlobalcom.dsGlobalTableAdapters.GLO_TIPODOCUMENTOTableAdapter
        Dim dtTipodoc As dsGlobal.GLO_TIPODOCUMENTODataTable = daTipodoc.GetDataByTipoDoc(tipodoc)
        Dim daOrdenCompra As New lbGlobalcom.dsComprasTableAdapters.COM_ENCABEZADOORDENCOMPRATableAdapter
        Dim dtOrdenCompra As dsCompras.COM_ENCABEZADOORDENCOMPRADataTable = daOrdenCompra.GetDataByTipoDocnumero(tipodoc, numero)
        Return dtOrdenCompra
    End Function

    Public Function buscaTipodoc(ByVal tipodoc As String) As lbGlobalcom.dsGlobal.GLO_TIPODOCUMENTODataTable
        Dim daTipodoc As New lbGlobalcom.dsGlobalTableAdapters.GLO_TIPODOCUMENTOTableAdapter
        Dim dtTipodoc As dsGlobal.GLO_TIPODOCUMENTODataTable = daTipodoc.GetDataByTipoDoc(tipodoc)
        Return dtTipodoc
    End Function


    Protected Overrides Sub Finalize()

    End Sub

    Public Function fechaVence() As Date

    End Function

    Public Sub aplicarPromocion()

    End Sub

    Public Sub valoresEncabezado()

    End Sub

    Public Sub reversaTransaccion()

    End Sub

    Public Function diocumentoExiste() As Boolean

    End Function
    Public Function validarCliente() As eEstados

    End Function

    Public Function validarProveedor() As eEstados

    End Function

    Public Function validarVendedor() As eEstados

    End Function

    Public Function validarBodega() As eEstados

    End Function

    Public Sub validarCcosto()

    End Sub

    Public Function cerrarDocumento() As Boolean
        Dim conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
        Dim cmd As OracleCommand
        Try
            Dim valido As Boolean = validaMovimiento()
            If valido = True Then
                Dim drmov As dsMovimiento.MOV_MOVIMIENTORow = lDsmov.MOV_MOVIMIENTO.Rows(0)
                cmd = conn.CreateCommand
                cmd.CommandText = "UPDATE MOV_MOVIMIENTO SET CERRADO='S'" & _
                                  " WHERE IDDOCUMENTO=:PDOC AND NUMERO=:PNUM"
                cmd.Parameters.Add("PDOC", OracleDbType.Varchar2).Value = drmov.IDDOCUMENTO
                cmd.Parameters.Add("PNUM", OracleDbType.Int32).Value = drmov.NUMERO
                conn.Open()
                cmd.ExecuteNonQuery()
            End If
            Return valido
        Catch ex As Exception
            Throw ex
        Finally
            conn.Close()
        End Try
    End Function

    Public Function consultaEstadoDocumento() As String
        Dim conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
        Dim cmd As OracleCommand
        Dim EstadoDoc As String = "N"
        Try
            Dim drmov As dsMovimiento.MOV_MOVIMIENTORow = lDsmov.MOV_MOVIMIENTO.Rows(0)
            cmd = conn.CreateCommand
            cmd.CommandText = "SELECT DECODE(CERRADO,NULL,'N',CERRADO) FROM MOV_MOVIMIENTO" & _
                              " WHERE IDDOCUMENTO=:PDOC AND NUMERO=:PNUM"
            cmd.Parameters.Add("PDOC", OracleDbType.Varchar2).Value = drmov.IDDOCUMENTO
            cmd.Parameters.Add("PNUM", OracleDbType.Int32).Value = drmov.NUMERO
            conn.Open()
            EstadoDoc = cmd.ExecuteScalar
            Return EstadoDoc
        Catch ex As Exception
            Throw ex
        Finally
            conn.Close()
        End Try
    End Function

    Public Function validaMovimiento() As Boolean
        Try

            Dim valido As Boolean = False
            For Each drDetMov As dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsmov.MOV_MOVIMIENTODETALLE.Rows
                Dim cantidad As Integer = 0
                Dim cProd As cProducto = New cProducto(drDetMov.IDPRODUCTO)
                For Each drDesMov As dsMovimiento.MOV_DESCRIPCIONDETRow In lDsmov.MOV_DESCRIPCIONDET.Rows
                    If drDetMov.IDPRODUCTO = drDesMov.IDPRODUCTO And drDetMov.NUMEROLINEA = drDesMov.NUMEROLINEA Then
                        cantidad += 1
                    End If
                Next
                If (drDetMov.CANTIDAD * cProd.CantidadSubProd) = cantidad Then
                    valido = True
                Else
                    Return False
                End If
            Next
            Return valido
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Public Function validaMovimientoDescripcion() As Boolean
        Try
            If lDsmov.MOV_DESCRIPCIONDET.Rows.Count > 0 Then

                For Each dr As dsMovimiento.MOV_DESCRIPCIONDETRow In lDsmov.MOV_DESCRIPCIONDET.Rows
                    If dr.IDPRODUCTO = lIdProducto Then
                        Return True
                    End If
                Next

            Else
                Return False
            End If
        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Function buscarCerrado(ByVal documento As String, ByVal numero As Integer) As String
        Dim conn As OracleConnection = New OracleConnection(My.Settings.ConnectionString)
        Dim cmd As OracleCommand
        Try
            cmd = conn.CreateCommand
            cmd.CommandText = "SELECT NVL(CERRADO,'N') FROM MOV_MOVIMIENTO" & _
                             " WHERE IDDOCUMENTO=:PDOC AND NUMERO=:PNUM"
            cmd.Parameters.Add("PDOC", OracleDbType.Varchar2).Value = documento
            cmd.Parameters.Add("PNUM", OracleDbType.Int32).Value = numero
            conn.Open()
            Return cmd.ExecuteScalar()
        Catch ex As Exception
            Throw ex
        Finally
            conn.Close()
        End Try
    End Function

    Public Function cantidadPrepackCargados() As Integer
        Try
            Dim cantidad As Integer = 0
            If lDsmov.MOV_DESCRIPCIONDET.Rows.Count > 0 Then
                For Each dr As dsMovimiento.MOV_DESCRIPCIONDETRow In lDsmov.MOV_DESCRIPCIONDET.Rows
                    If dr.NUMEROLINEA = lNumeroLinea And dr.IDPRODUCTO = lIdProducto Then
                        cantidad += 1
                    End If
                Next
            End If
            Return cantidad
        Catch ex As Exception
            Throw ex
        End Try
    End Function

End Class

Public Class cGeneraDocumentoAutomatico
    Private iTipoDoc As cTipoDocumento
    Private iConsec As Consec
    Private lDaEncamov As dsMovimientoTableAdapters.MOV_MOVIMIENTOTableAdapter
    Private lDaDetamov As dsMovimientoTableAdapters.MOV_MOVIMIENTODETALLETableAdapter
    Private lDaDescmov As dsMovimientoTableAdapters.MOV_DESCRIPCIONDETTableAdapter
    Private lDsMovimiOri As dsMovimiento
    Private lDsMovimiDes As dsMovimiento
    Private lNumeroDoc As Integer
    Public Sub New(ByVal TipoDocGenera As String, ByVal dsMovimiOri As dsMovimiento)
        Try
            iTipoDoc = New cTipoDocumento(TipoDocGenera)
            iConsec = New Consec()
            lDaEncamov = New dsMovimientoTableAdapters.MOV_MOVIMIENTOTableAdapter
            lDaDetamov = New dsMovimientoTableAdapters.MOV_MOVIMIENTODETALLETableAdapter
            lDaDescmov = New dsMovimientoTableAdapters.MOV_DESCRIPCIONDETTableAdapter
            lDsMovimiOri = dsMovimiOri
            lDsMovimiDes = New dsMovimiento
            GeneraEncabezaMov()
            EliminaDetalles()
            GeneraDetalleMov()
            GeneraDescripDetalleMov()
            Dim ActuaInve As cAfectaIventarios = New cAfectaIventarios(lDsMovimiDes, iTipoDoc, CustomPrincipal.Periodo, False, "N")
            ActuaInve.AfectaInventarios()
        Catch ex As Exception
            cError.SalvaError(ex, "Samuel")
            Throw ex
        End Try
    End Sub
    Private Sub EliminaDetalles()
        Try
            For Each drDet As dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsMovimiDes.MOV_MOVIMIENTODETALLE.Rows
                drDet.Delete()
            Next
            For Each drDetDesc As dsMovimiento.MOV_DESCRIPCIONDETRow In lDsMovimiDes.MOV_DESCRIPCIONDET.Rows
                drDetDesc.Delete()
            Next
        Catch ex As Exception
            cError.SalvaError(ex, "Samuel")
            Throw ex
        End Try
    End Sub
    Private Sub GeneraEncabezaMov()
        Try
            Dim drMov As dsMovimiento.MOV_MOVIMIENTORow = lDsMovimiOri.MOV_MOVIMIENTO.Rows(0)
            Dim drMovDes As dsMovimiento.MOV_MOVIMIENTORow
            Dim Esta As Boolean = False
            If drMov IsNot Nothing Then
                If Not drMov.IsIDDOCREFERENCIANull AndAlso Not drMov.IsNUMEROREFERENCIANull Then
                    lDaEncamov.FillByIdDocumentoNumero(lDsMovimiDes.MOV_MOVIMIENTO, drMov.IDDOCREFERENCIA, drMov.NUMEROREFERENCIA)
                    lDaDetamov.FillByIdDocumentoNumero(lDsMovimiDes.MOV_MOVIMIENTODETALLE, drMov.IDDOCREFERENCIA, drMov.NUMEROREFERENCIA)
                    lDaDescmov.FillByIdDocumentoNumero(lDsMovimiDes.MOV_DESCRIPCIONDET, drMov.IDDOCREFERENCIA, drMov.NUMEROREFERENCIA)
                    If lDsMovimiDes.MOV_MOVIMIENTO.Rows.Count > 0 Then
                        drMovDes = lDsMovimiDes.MOV_MOVIMIENTO.Rows(0)
                        Esta = True
                    Else
                        drMovDes = lDsMovimiDes.MOV_MOVIMIENTO.NewMOV_MOVIMIENTORow
                        drMovDes.IDDOCUMENTO = iTipoDoc.TipoDoc
                        drMovDes.NUMERO = Consec.GetNumeroActual(iTipoDoc.TipoDoc, iTipoDoc.DocEs)
                    End If
                Else
                    drMovDes = lDsMovimiDes.MOV_MOVIMIENTO.NewMOV_MOVIMIENTORow
                    drMovDes.IDDOCUMENTO = iTipoDoc.TipoDoc
                    drMovDes.NUMERO = Consec.GetNumeroActual(iTipoDoc.TipoDoc, iTipoDoc.DocEs)
                End If
                'Consec.ActualizaConsec(iTipoDoc.TipoDoc, iTipoDoc.DocEs, drMovDes.NUMERO)
                drMovDes.FECHADOCUMENTO = drMov.FECHADOCUMENTO
                drMovDes.FECHAVENCIMIENTO = drMov.FECHAVENCIMIENTO
                drMovDes.IDBODEGADESTINO = iTipoDoc.BodegaPara
                drMovDes.IDBODEGAORIGEN = iTipoDoc.BodegaDe
                drMovDes.IDLISTA = iTipoDoc.idLista
                drMovDes.IDCCOSTO = iTipoDoc.idCcosto
                drMovDes.IDSEDE = iTipoDoc.idSede
                drMovDes.IDDOCREFERENCIA = drMov.IDDOCUMENTO
                drMovDes.NUMEROREFERENCIA = drMov.NUMERO
                If iTipoDoc.DocEs = eTipoMovimi.Compra Or iTipoDoc.DocEs = eTipoMovimi.Venta Or iTipoDoc.DocEs = eTipoMovimi.Resmision Then
                    drMovDes.IDTERCERO = drMov.IDTERCERO
                    drMovDes.SUCURSAL = drMov.SUCURSAL
                    drMovDes.IDFORMAPAGO = drMov.IDFORMAPAGO
                    drMovDes.NOFACCOMCEL = drMov.NOFACCOMCEL
                    Dim iFP As cFormasPago = New cFormasPago(drMovDes.IDFORMAPAGO)
                    drMovDes.FECHAVENCIMIENTO = iFP.GetFechaVence(drMovDes.FECHADOCUMENTO)
                    iFP = Nothing
                    drMovDes.IDCANAL = drMov.IDCANAL
                    drMovDes.IDVENDEDOR = drMov.IDVENDEDOR
                End If
                drMovDes.NOTA = "GEN.AUTO TD=" & drMov.IDDOCUMENTO & " Y NUM=" & drMov.NUMERO
                If Not Esta Then _
                    lDsMovimiDes.MOV_MOVIMIENTO.Rows.Add(drMovDes)
                lDaEncamov.Update(lDsMovimiDes.MOV_MOVIMIENTO)
                lNumeroDoc = drMovDes.NUMERO
                drMov.IDDOCREFERENCIA = drMovDes.IDDOCUMENTO
                drMov.NUMEROREFERENCIA = drMovDes.NUMERO
                lDaEncamov.Update(lDsMovimiOri.MOV_MOVIMIENTO)
            End If
        Catch ex As Exception
            cError.SalvaError(ex, "Samuel")
            Throw ex
        End Try
    End Sub

    Private Sub GeneraDetalleMov()
        Try
            For Each drDetMov As dsMovimiento.MOV_MOVIMIENTODETALLERow In lDsMovimiOri.MOV_MOVIMIENTODETALLE.Rows
                Dim drDetMovDes As dsMovimiento.MOV_MOVIMIENTODETALLERow = lDsMovimiDes.MOV_MOVIMIENTODETALLE.NewMOV_MOVIMIENTODETALLERow
                drDetMovDes.NUMERO = lNumeroDoc
                drDetMovDes.IDDOCUMENTO = iTipoDoc.TipoDoc
                drDetMovDes.CANTIDAD = drDetMov.CANTIDAD
                drDetMovDes.DESCUENTO1 = 0
                drDetMovDes.DESCUENTO2 = 0
                Dim ListaP As New cDetalleListaPrecios(iTipoDoc.idLista, drDetMov.IDPRODUCTO)
                drDetMovDes.IDPRODUCTO = drDetMov.IDPRODUCTO
                drDetMovDes.NUMEROLINEA = drDetMov.NUMEROLINEA
                drDetMovDes.IDIVA = IIf(drDetMov.IsIDIVANull, 0, drDetMov("IDIVA"))
                drDetMovDes.VALORBASE = ListaP.PrecioConDto
                drDetMovDes.VALORIVA = ListaP.Iva
                drDetMovDes.VALORLINEA = drDetMovDes.CANTIDAD * (drDetMovDes.VALORBASE + drDetMovDes.VALORIVA)
                lDsMovimiDes.MOV_MOVIMIENTODETALLE.Rows.Add(drDetMovDes)
            Next
            lDaDetamov.Update(lDsMovimiDes.MOV_MOVIMIENTODETALLE)
        Catch ex As Exception
            cError.SalvaError(ex, "Samuel")
            Throw ex
        End Try
    End Sub

    Private Sub GeneraDescripDetalleMov()
        Try
            For Each drDescDetMov As dsMovimiento.MOV_DESCRIPCIONDETRow In lDsMovimiOri.MOV_DESCRIPCIONDET.Rows
                Dim drDescDetMovDes As dsMovimiento.MOV_DESCRIPCIONDETRow = lDsMovimiDes.MOV_DESCRIPCIONDET.NewMOV_DESCRIPCIONDETRow
                drDescDetMovDes.IDDOCUMENTO = iTipoDoc.TipoDoc
                drDescDetMovDes.NUMERO = lNumeroDoc
                drDescDetMovDes.TIPOSUBPROD = drDescDetMov.TIPOSUBPROD
                drDescDetMovDes.NUMEROREGISTRO = drDescDetMov.NUMEROREGISTRO
                drDescDetMovDes.IDPRODUCTO = drDescDetMov.IDPRODUCTO
                drDescDetMovDes.NUMEROPRODUCTO = drDescDetMov.NUMEROPRODUCTO
                drDescDetMovDes.NUMEROLINEA = drDescDetMov.NUMEROLINEA
                lDsMovimiDes.MOV_DESCRIPCIONDET.Rows.Add(drDescDetMovDes)
            Next
            lDaDescmov.Update(lDsMovimiDes.MOV_DESCRIPCIONDET)
        Catch ex As Exception
            cError.SalvaError(ex, "Samuel")
            Throw ex
        End Try
    End Sub
End Class

Public Class cFacturasRecargaPasatiempo
    Private iTipoDoc As cTipoDocumento
    Private lIdproducto As String
    Private iConsec As Consec
    Private lDsMovimi As dsMovimiento
    Private lDaEncamov As dsMovimientoTableAdapters.MOV_MOVIMIENTOTableAdapter
    Private lDaDetamov As dsMovimientoTableAdapters.MOV_MOVIMIENTODETALLETableAdapter
    Private lCliente As String
    Private lVendedor As String
    Private lCaja As String
    Private lSucursal As String
    Private lValorRecarga As Decimal
    Private lTipo As Integer
    Dim iPer As cPeriodos
    Dim iCliente As cClientes
    Dim iProducto As cProducto
    Private lLista As List(Of String)
    Public Sub New(ByVal tipodoc As String, ByVal idproducto As String, ByVal cliente As String, ByVal sucursal As String, ByVal vendedor As String, ByVal caja As String, ByVal valorRecarga As Decimal, ByVal tipo As Integer)
        Try
            lCliente = cliente
            lSucursal = sucursal
            lVendedor = vendedor
            lCaja = caja
            lDsMovimi = New dsMovimiento
            iTipoDoc = New cTipoDocumento(tipodoc)
            lDaEncamov = New dsMovimientoTableAdapters.MOV_MOVIMIENTOTableAdapter
            lDaDetamov = New dsMovimientoTableAdapters.MOV_MOVIMIENTODETALLETableAdapter
            iConsec = New Consec()
            iPer = New cPeriodos()
            iCliente = New cClientes(lCliente)
            iProducto = New cProducto(idproducto)
            lIdproducto = idproducto
            lValorRecarga = valorRecarga
            lTipo = tipo
            lLista = New List(Of String)
        Catch ex As Exception
            cError.SalvaError(ex, "Henry")
        End Try
    End Sub

    Public ReadOnly Property mlista() As List(Of String)
        Get
            Return lLista
        End Get
    End Property

    Public Sub generaFacturas()
        Dim totalRecarga As Decimal = 0
        Dim recarga As Decimal = 0
        Dim drMov As dsMovimiento.MOV_MOVIMIENTORow = Nothing
        Dim drDetMov As dsMovimiento.MOV_MOVIMIENTODETALLERow = Nothing
        ' Dim numeros As String
        Try
            While lValorRecarga <> 0
                If lTipo = 0 Then
                    recarga = valorRecarga()
                Else
                    recarga = lValorRecarga
                End If

                If recarga < lValorRecarga Then
                    lValorRecarga -= recarga
                Else
                    recarga = lValorRecarga
                    lValorRecarga = 0
                End If
                lDsMovimi.MOV_MOVIMIENTODETALLE.Rows.Clear()
                lDsMovimi.MOV_MOVIMIENTO.Rows.Clear()
                drMov = lDsMovimi.MOV_MOVIMIENTO.NewMOV_MOVIMIENTORow
                encabezado(drMov)
                drDetMov = lDsMovimi.MOV_MOVIMIENTODETALLE.NewMOV_MOVIMIENTODETALLERow
                detalle(drMov, drDetMov, recarga)
                SalvaCambios()
                Dim cmov As New cMovimiento(lDsMovimi)
                cmov.cerrarDocumento()
            End While
        Catch ex As Exception
            cError.SalvaError(ex, "Henry")
        End Try
    End Sub

    Private Sub SalvaCambios()
        Try
            Dim AfecInv As New cAfectaIventarios(lDsMovimi, iTipoDoc, iPer, False, iCliente, "N")
            AfecInv.AfectaInventarios()
            AfecInv = Nothing
            lDaEncamov.Update(lDsMovimi.MOV_MOVIMIENTO)
            lDaDetamov.Update(lDsMovimi.MOV_MOVIMIENTODETALLE)
        Catch ex As Exception
            cError.SalvaError(ex, "Henry")
        End Try
    End Sub

    Private Sub encabezado(ByVal drMov As dsMovimiento.MOV_MOVIMIENTORow)
        Try
            drMov.IDDOCUMENTO = iTipoDoc.TipoDoc
            drMov.NUMERO = Consec.GetNumeroActual(iTipoDoc.TipoDoc, iTipoDoc.DocEs)
            drMov.FECHADOCUMENTO = Date.Now.Date
            drMov.FECHAVENCIMIENTO = Date.Now.Date
            drMov.IDBODEGADESTINO = iTipoDoc.BodegaPara
            drMov.IDBODEGAORIGEN = iTipoDoc.BodegaDe
            drMov.IDLISTA = iTipoDoc.idLista
            drMov.IDCCOSTO = iTipoDoc.idCcosto
            drMov.IDSEDE = iTipoDoc.idSede
            drMov.IDTERCERO = lCliente
            drMov.SUCURSAL = lSucursal
            drMov.IDVENDEDOR = lVendedor
            drMov.IDCAJA = lCaja
            drMov.IDFORMAPAGO = iCliente.idFormaPago
            lDsMovimi.MOV_MOVIMIENTO.Rows.Add(drMov)
        Catch ex As Exception
            cError.SalvaError(ex, "Henry")
        End Try

    End Sub

    Private Sub detalle(ByVal drMov As dsMovimiento.MOV_MOVIMIENTORow, ByVal drDetMov As dsMovimiento.MOV_MOVIMIENTODETALLERow, ByVal recarga As Decimal)
        Try
            drDetMov.NUMERO = drMov.NUMERO
            drDetMov.IDDOCUMENTO = iTipoDoc.TipoDoc
            drDetMov.CANTIDAD = recarga
            drDetMov.IDPREPACK = 0
            drDetMov.DESCUENTO1 = 0
            drDetMov.DESCUENTO2 = 0
            Dim ListaP As New cDetalleListaPrecios(iTipoDoc.idLista, lIdproducto)
            drDetMov.IDPRODUCTO = lIdproducto
            drDetMov.NUMEROLINEA = 1
            drDetMov.IDIVA = iProducto.IdTipoIva
            drDetMov.VALORBASE = ListaP.PrecioConDto
            drDetMov.VALORIVA = ListaP.Iva
            drDetMov.VALORLINEA = recarga * (drDetMov.VALORBASE + drDetMov.VALORIVA)
            lDsMovimi.MOV_MOVIMIENTODETALLE.Rows.Add(drDetMov)
            lLista.Add(drMov.NUMERO & " - " & recarga)
        Catch ex As Exception
            cError.SalvaError(ex, "Henry")
        End Try
    End Sub

    Private Function valorRecarga() As Decimal
        Dim Valor As Integer
        Try
            Randomize()
            Valor = CInt(Int((20 * Rnd()) + 1))
            If Valor >= 1 And Valor <= 3 Then
                Valor *= 10000
            Else
                Valor *= 1000
            End If
            Return Valor
        Catch ex As Exception
            cError.SalvaError(ex, "Henry")
        End Try
    End Function
End Class

Public Class cProcesaMacro
    Private iMacro As cMacroMovimi

    Private Sub ProcesaMacro(ByVal dsMovOri As dsMovimiento)
        For Each dr As dsGlobalAutoMovimi.GLO_DETAMACROMOVIMIRow In iMacro.DetalleMacro.Rows
            Try
                Dim cAtoMov As cGeneraDocumentoAutomatico = New cGeneraDocumentoAutomatico(dr.IDDOCUMENTO, dsMovOri)
                cAtoMov = Nothing
            Catch ex As Exception
                Throw ex
            End Try
        Next
    End Sub
    Public Sub New(ByVal IdMacro As String, ByVal DsMovOri As dsMovimiento)
        iMacro = New cMacroMovimi(IdMacro)
        ProcesaMacro(DsMovOri)
    End Sub
End Class